#include <stdio.h>
#include <math.h>
#include <stdlib.h>

// 递归填充日程表
void fillSchedule(int n, int** table, int start, int size) {
    if (size == 1) {
        return; // 单个选手无需比赛，直接返回
    }
    
    int half = size / 2;
    
    // 递归处理左上角子表
    fillSchedule(n, table, start, half);
    
    // 填充右上角子表：上半区后半段 = 上半区前半段 + half
    for (int i = start; i < start + half; i++) {
        for (int j = 0; j < half; j++) {
            // 右上角坐标 = (i, start + half + j)
            // 对应左上角坐标 = (i, start + j)
            table[i][start + half + j] = table[i][start + j] + half;
        }
    }
    
    // 填充左下角子表：下半区前半段 = 上半区前半段 + half
    for (int i = start; i < start + half; i++) {
        for (int j = 0; j < half; j++) {
            // 左下角坐标 = (i + half, start + j)
            table[i + half][start + j] = table[i][start + j] + half;
        }
    }
    
    // 填充右下角子表：下半区后半段 = 上半区前半段
    for (int i = start; i < start + half; i++) {
        for (int j = 0; j < half; j++) {
            // 右下角坐标 = (i + half, start + half + j)
            table[i + half][start + half + j] = table[i][start + j];
        }
    }
}

// 生成循环赛日程表
void generateSchedule(int k) {
    int n = (int)pow(2, k);  // 计算选手数量n=2^k
    if (n < 2) {
        printf("选手数量必须至少为2（k≥1）\n");
        return;
    }
    
    // 动态分配n×n的二维数组（存储日程表）
    int** table = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++) {
        table[i] = (int*)malloc(n * sizeof(int));
    }
    
    // 初始化第一天的比赛（对角线元素为自身，后续会替换）
    for (int i = 0; i < n; i++) {
        table[i][i] = i + 1;
    }
    
    // 递归填充日程表
    fillSchedule(n, table, 0, n);
    
    // 输出日程表（行：选手，列：每天的对手）
    printf("循环赛日程表（%d名选手，%d天）：\n", n, n - 1);
    for (int i = 0; i < n; i++) {
        printf("选手%d: ", i + 1);
        for (int j = 0; j < n; j++) {
            if (i != j) {  // 跳过自己对自己的比赛
                printf("%d ", table[i][j]);
            }
        }
        printf("\n");
    }
    
    // 释放动态分配的内存
    for (int i = 0; i < n; i++) {
        free(table[i]);
    }
    free(table);
}

int main() {
    int k;
    printf("请输入k（n=2^k，k≥1）: ");
    scanf("%d", &k);
    generateSchedule(k);
    return 0;
}